﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;

namespace LM.Tela.Desktop
{
    public partial class frmGaragem : Form
    {
        private const int PrimeiroRegistro = 0;
        private const int ItemNaoSelecionado = -1;
        public IList<DtoTelefone> listaTelefones = new List<DtoTelefone>(); 

        public frmGaragem()
        {
            InitializeComponent();

            CarragaUfs();
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            txtRazaoSocial.Text = string.Empty;
            mskTxtCnpj.Text = string.Empty;
            mskTxtInscricaoMunicipal.Text = string.Empty;
            mskTxtTelefone.Text = string.Empty;

            txtLogradouro.Text = string.Empty;
            mskTxtNumero.Text = string.Empty;
            txtLote.Text = string.Empty;
            txtQuadra.Text = string.Empty;
            txtQuadra.Text = string.Empty;
            txtBairro.Text = string.Empty;
            txtComplemento.Text = string.Empty;
            mskTxtCep.Text = string.Empty;
            txtCidade.Text = string.Empty;
            cbxUf.SelectedIndex = ItemNaoSelecionado;

            listaTelefones = new List<DtoTelefone>();
        }

        #region Métodos de controle

        private void CarragaUfs()
        {
            cbxUf.DataSource = Enum.GetValues(typeof(EnumUnidadeFederativa));
            cbxUf.SelectedIndex = ItemNaoSelecionado;
        }

        private void CarregaGaragem()
        {
            var servico = FabricaGenerica.Crie<IServicoDeGaragem>();
            var garagem = servico.Consulte();

            if (garagem != null)
            {
                txtRazaoSocial.Text = garagem.Nome;
                mskTxtCnpj.Text = garagem.Cnpj;
                mskTxtInscricaoMunicipal.Text = garagem.InscricaoMunicipal.ToString(CultureInfo.InvariantCulture);

                if (garagem.Telefones != null && garagem.Telefones.Count > 0)
                {
                    listaTelefones = garagem.Telefones.ToList();
                    PopulaCampoTelefonePrincipal();
                }

                txtLogradouro.Text = garagem.Endereco != null ? garagem.Endereco.Logradouro : string.Empty;
                mskTxtNumero.Text = garagem.Endereco != null ? garagem.Endereco.Numero.ToString(CultureInfo.InvariantCulture) : string.Empty;
                txtLote.Text = garagem.Endereco != null ? garagem.Endereco.Lote : string.Empty;
                txtQuadra.Text = garagem.Endereco != null ? garagem.Endereco.Quadra : string.Empty;
                txtBairro.Text = garagem.Endereco != null ? garagem.Endereco.Bairro : string.Empty;
                txtComplemento.Text = garagem.Endereco != null ? garagem.Endereco.Complemento : string.Empty;
                mskTxtCep.Text = garagem.Endereco != null ? garagem.Endereco.Cep.ToString(@"00\.000\-000") : string.Empty;
                txtCidade.Text = garagem.Endereco != null ? garagem.Endereco.Cidade : string.Empty;
                cbxUf.SelectedItem = garagem.Endereco != null ? garagem.Endereco.Uf : new object();
            }
        }

        private DtoGaragem ObtenhaObjetoFormulario()
        {
            var dtoGaragem = new DtoGaragem();

            dtoGaragem.Nome = txtRazaoSocial.Text.Trim();
            dtoGaragem.Cnpj = mskTxtCnpj.Text != @"  .   .   /    -  " ? mskTxtCnpj.Text.Replace(",", ".") : string.Empty;

            int inscricaoMunicipal;
            if (Int32.TryParse(mskTxtInscricaoMunicipal.Text.Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out inscricaoMunicipal))
            {
                dtoGaragem.InscricaoMunicipal = inscricaoMunicipal;
            }

            dtoGaragem.Telefones = listaTelefones;

            var dtoEndereco = new DtoEndereco();
            dtoEndereco.Codigo = 1;
            dtoEndereco.Logradouro = txtLogradouro.Text.Trim();

            var numero = 0;
            if (Int32.TryParse(mskTxtNumero.Text, NumberStyles.Integer, CultureInfo.InvariantCulture, out numero))
            {
                dtoEndereco.Numero = numero;
            }

            dtoEndereco.Numero = numero;

            dtoEndereco.Lote = txtLote.Text.Trim();
            dtoEndereco.Quadra = txtQuadra.Text.Trim();
            dtoEndereco.Bairro = txtBairro.Text.Trim();
            dtoEndereco.Complemento = txtComplemento.Text.Trim();
            var cep = mskTxtCep.Text.Trim()
                               .Replace(".", string.Empty)
                               .Replace(",", string.Empty)
                               .Replace("-", string.Empty);
            dtoEndereco.Cep = string.IsNullOrWhiteSpace(cep) ? 0 : Int32.Parse(cep, CultureInfo.InvariantCulture);
            dtoEndereco.Cidade = txtCidade.Text.Trim();

            EnumUnidadeFederativa uf;
            if (Enum.TryParse(cbxUf.SelectedItem == null ? string.Empty : cbxUf.SelectedItem.ToString(), true, out uf) 
                && Enum.IsDefined(typeof(EnumUnidadeFederativa), uf))
            {
                dtoEndereco.Uf = uf;
            }

            dtoGaragem.Endereco = dtoEndereco;

            return dtoGaragem;
        }

        private void PopulaCampoTelefonePrincipal()
        {
            if (listaTelefones.Count > 0)
            {
                var primeiroTelefone = listaTelefones[PrimeiroRegistro];
                var telefone = string.Format(CultureInfo.InvariantCulture, "{0}{1}",
                                             primeiroTelefone.Ddd > 0 ? primeiroTelefone.Ddd.ToString(CultureInfo.InvariantCulture) : "  ",
                                             primeiroTelefone.Numero);
                mskTxtTelefone.Text = telefone;
            }
        }

        #endregion

        private void frmGaragem_Load(object sender, EventArgs e)
        {
            CarregaGaragem();
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            var garagem = ObtenhaObjetoFormulario();

            var servico = FabricaGenerica.Crie<IServicoDeGaragem>();
            servico.Cadastre(garagem);

            MessageBox.Show("Garagem salva com sucesso.", "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var frmTelefone = new frmTelefone(this);
            frmTelefone.Telefones = listaTelefones.ToList();
            frmTelefone.ShowDialog(this);
            PopulaCampoTelefonePrincipal();
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            var resultado = MessageBox.Show("Deseja realmente exlcuir a garagem?", "Confirmação", MessageBoxButtons.YesNo,
                            MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
            if (resultado.Equals(DialogResult.Yes))
            {
                var servico = FabricaGenerica.Crie<IServicoDeGaragem>();
                servico.Exclua();

                MessageBox.Show("Garagem excluída com sucesso.", "Informação", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
            }
        }
    }
}
